home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
5 Star Games: DOS Edition 2
/
5 Star Games - DOS Edition (1995)(Ready to Run).iso
/
dbc
/
db_list.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-03
|
16KB
|
579 lines
/****************************************************************************/
/* DATABOSS MODULE: DB_LIST.C */
/****************************************************************************/
#include "db_lsc.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "db_types.h"
#include "db_curs.h"
#include "db_dos.h"
#include "db_file.h"
#include "db_gvar.h"
#include "db_heap.h"
#include "db_funcs.h"
#include "db_key.h"
#include "db_str.h"
#include "db_tree.h"
#include "db_win.h"
#include "db_util.h"
#include "db_list.h"
/************************* INITIALIZED VARIABLES **************************/
bool oldFindMethod = True;
/**************************** GLOBAL VARIABLES ****************************/
byte lwid;
bool brief;
bool listing;
recnotyp recno;
recavailtyp recavail;
rectabptr rectab;
linktyp link;
keyexprproc _keyexpr;
getrecproc _getarec;
getstrfunc _horizrec;
/*************************** INTERNAL VARIABLES ***************************/
static byte fno,
kno,
len,
listmax,
startpos,
lastdirn;
static indexfile *idx;
static bool redraw,
quit_flag;
static int scroll,
midlist,
savlen,
listlen,
listwid,
listx,
listy,
savpos,
pno,
y,
numup,
numdn;
static keystr kystr,
search,
matchStrFind;
static string l_hdr,
blnk;
static winptr fwinp,
twinp;
static bool initialized = False;
/***************************** IMPLEMENTATION *****************************/
strptr defaultdata(string sout, ptr fb)
{
bool done;
word w;
string ts;
strptr s;
int tslen,slen;
fldblk *fblk;
fldtyp *fld;
fblk = (fldblk *) fb;
done = False;
s = sout;
slen = 0;
w = 0;
fld = &(*(fblk->farr)[0]);
while ((w < fblk->numf) && !done) {
if ((fld->typ != _Memo) && (gvar->sec >= fld->dsec)) {
tslen = strlen(pic_fld(ts,fld->faddr,fld->typ,0,0,fld->pic));
if ((tslen+slen) > 252) {
tslen = 252 - slen;
ts[tslen] = '\0';
}
s = stpcpy(s," │ ");
s = stpcpy(s,ts);
done = (bool) ((slen += tslen + 3) > 252);
}
fld++;
w++;
}
*s = '\0';
return (sout);
}
void fillrtab(tabtyp *t)
{
string ts;
t->ref = recno[fno];
if (brief)
strcpy(t->dsp,pad(ts,kystr,78,Right));
else {
_getarec(fno);
if (lockget)
t->ref = -(t->ref);
_horizrec(ts,_Data,fno,kno);
if (*ts == '\0') {
pad(ts,kystr,78,Right);
brief = True;
}
strcpy(t->dsp,ts);
}
}
void refilltab(void)
{
int i;
string ts;
strptr sp;
i = (savpos != 0) ? savpos : (pno + midlist - 2) % listlen + 1;
if (lastdirn == DArr) {
while (labs((*rectab)[i].ref) != recno[fno])
prevkey(idx,&recno[fno],kystr);
}
if (lastdirn == UArr) {
while (labs((*rectab)[i].ref) != recno[fno])
nextkey(idx,&recno[fno],kystr);
}
_horizrec(l_hdr,_Header,fno,kno);
strcpy(blnk,l_hdr);
sp = blnk;
while (*sp != '\0') {
if (*sp != 0xB3)
*(sp++) = ' ';
else
sp++;
}
pno = 1;
y = midlist;
do {
prevkey(idx,&recno[fno],kystr);
ok = ok && ((strsearch(kystr,matchStrFind) == kystr) || (strlen(matchStrFind) == 0) || oldFindMethod);
if (ok) y--;
} while (ok && (y != 1));
if (!ok)
nextkey(idx,&recno[fno],kystr);
for (i = 1; i <= y-1; i++) {
(*rectab)[i].ref = 0;
strcpy((*rectab)[i].dsp,blnk);
}
numup = midlist-y;
fillrtab(&(*rectab)[y]);
while (ok && (y < listlen)) {
nextkey(idx,&recno[fno],kystr);
ok = ok && ((strsearch(kystr,matchStrFind) == kystr) || (strlen(matchStrFind) == 0) || oldFindMethod);
if (ok)
fillrtab(&(*rectab)[++y]);
}
if (!ok)
prevkey(idx,&recno[fno],kystr);
for (i = y+1; i <= listlen; i++) {
(*rectab)[i].ref = 0;
strcpy((*rectab)[i].dsp,blnk);
}
numdn = y-midlist;
lastdirn = DArr;
if (brief) {
for (i = 1; i <= listlen + 1; i++)
writewxy(strcopy(ts,blnk,0,listwid),_av,1,(byte) i,fwinp);
}
writewxy(centre(ts,strcopy(ts,LSC_ListMenu,0,listwid),listwid),
_ev,1,(byte)(listlen+2),fwinp);
redraw = True;
return;
}
uchar display_list(int pno)
{
byte lck;
uchar mv;
int z;
string ts;
strptr sp;
if (redraw) {
writewxy(strcopy(ts,l_hdr,startpos-1,listwid),_iv,1,1,fwinp);
for (z = 1; z <= listlen; z++) {
lck = (byte) (((*rectab)[z].ref < 0) ? 0x80 : 0x00);
writewxy(strcopy(ts,(*rectab)[z].dsp,startpos-1,listwid),
(byte)(_av | lck),1,(byte)((z-pno+listlen)%listlen+2),fwinp);
}
z = ((pno+midlist-2)%listlen)+1;
lck = (byte) (((*rectab)[z].ref < 0) ? 0x80 : 0x00);
writewxy(strcopy(ts,(*rectab)[z].dsp,startpos-1,listwid),
(byte)(_ev | lck),1,(byte)(midlist+1),fwinp);
redraw = False;
}
lck = fwinp->wid-2-strlen(search);
sp = stpcpy(ts,search);
sp = stpcpy(sp,"\xFF\x01");
*(sp++) = lck;
*(sp++) = fwinp->borchrs[4];
*sp = '\0';
writewxy(ts,0,(byte)(fwinp->x+1),(byte)(fwinp->y+fwinp->hgt),NULL);
if (scroll == 0)
mv = getkey();
return (mv);
}
long list_n_choose(byte _fno, byte _kno, keystr _kystr, indexfile *_idx, findwtyp wdim)
{
long fval;
string ts;
int i,slen;
uchar action,inp;
trim(matchStrFind,_kystr);
fno = _fno;
kno = _kno;
strcpy(kystr,_kystr);
idx = _idx;
if (!(wdim.h % 2)) wdim.h--;
if (wdim.h < 5) wdim.h = 5;
if (wdim.h > (scrhgt - 4)) wdim.h = 21;
if (wdim.w < lwid) wdim.w = lwid;
if (wdim.w > (scrwid - 2)) wdim.w = scrwid - 2;
if (wdim.x < 2) wdim.x = 2;
if (wdim.x > (scrwid - 4)) wdim.x = scrwid - 4;
if (wdim.y < 2) wdim.y = 2;
if (wdim.y > (scrhgt - 4)) wdim.y = scrhgt - 4;
if (((wdim.x + wdim.w) > scrwid)) wdim.x = 2;
if (((wdim.y + wdim.h) > scrhgt)) wdim.y = 2;
fval = -1;
link = No_Link;
lastdirn = ' ';
action = ' ';
search[0] = '\0';
startpos = pno = 1;
savpos = scroll = 0;
brief = quit_flag = False;
listlen = wdim.h;
listwid = wdim.w;
listx = wdim.x;
listy = wdim.y;
midlist = (listlen/2) + 1;
listmax = scrhgt - 4;
if (listmax == 46) listmax = 45;
if ((_getarec != NULL) && (_horizrec != NULL) &&
openwin(0, listx, listy, 78, (byte)(listmax+2), 15, 31, 8, "─┐│┘─└│┌", TopCnt, strconcat(ts," ", LSC_ListOf, " ", NULL))) {
fwinp = curwin;
resizewin(0,0,listwid-78,listlen-listmax,fwinp);
hidewin(T_ON,fwinp);
refilltab();
delay(100);
kflush();
do {
if (scroll > 0) {
display_list(pno);
switch (action) {
case PgUp :
case UArr :
if (numup > 0) {
pno = (pno + listlen-2) % listlen + 1;
if (lastdirn != UArr) {
lastdirn = UArr;
for (i = 1; i <= numup+numdn; i++) prevkey(idx,&recno[fno],kystr);
}
prevkey(idx,&recno[fno],kystr);
ok = ok && ((strsearch(kystr,matchStrFind) == kystr) || (strlen(matchStrFind) == 0) || oldFindMethod);
if (ok) fillrtab(&(*rectab)[pno]);
else {
numup--;
(*rectab)[pno].ref = 0;
strcpy((*rectab)[pno].dsp,blnk);
nextkey(idx,&recno[fno],kystr);
};
if (numdn < (midlist-1)) numdn++;
redraw = True;
}
else {
audible(Warning);
scroll = 1;
}
break;
case PgDn :
case DArr :
if (numdn > 0) {
if (lastdirn != DArr) {
lastdirn = DArr;
for (i = 1; i <= numup+numdn; i++) nextkey(idx,&recno[fno],kystr);
}
nextkey(idx,&recno[fno],kystr);
ok = ok && ((strsearch(kystr,matchStrFind) == kystr) || (strlen(matchStrFind) == 0) || oldFindMethod);
if (ok) fillrtab(&(*rectab)[pno]);
else {
numdn--;
(*rectab)[pno].ref = 0;
strcpy((*rectab)[pno].dsp,blnk);
prevkey(idx,&recno[fno],kystr);
}
pno = pno % listlen + 1;
if (numup < (midlist-1)) numup++;
redraw = True;
}
else {
audible(Warning);
scroll = 1;
}
break;
}
scroll--;
}
else {
action = display_list(pno);
if (_xkey || (action == Enter)) search[0] = '\0';
switch (action) {
case _AltZoom :
hidewin(T_OFF,fwinp);
savpos = (pno + midlist - 2) % listlen + 1;
if ((listwid == 78) && (listlen == listmax)) {
movewin(wdim.x,wdim.y,fwinp);
listx = wdim.x;
listy = wdim.y;
resizewin(0,0,wdim.w-78,wdim.h-listmax,fwinp);
listwid = wdim.w;
listlen = wdim.h;
}
else {
movewin(2,2,fwinp);
listx = 2;
listy = 2;
resizewin(0,0,78-listwid,listmax-listlen,fwinp);
listwid = 78;
listlen = listmax;
}
midlist = (listlen/2) + 1;
refilltab();
savpos = 0;
hidewin(T_ON,fwinp);
break;
case _AltResize :
len = (byte) maximum(strlen(LSC_UsePr + 5), strlen(LSC_ToFinish));
if (openwin(0,listx+1,listy+1,len,2,31,31,8,"─┐│┘─└│┌",TopCnt,
strconcat(ts," ",LSC_Resize," ",NULL))) {
twinp = curwin;
twinp->disp = True;
dispwindow(twinp);
writewxy(centre(ts,strconcat(ts,LSC_UsePr,
" \x1B\x1A\x18\x19",NULL),len),31,1,1,twinp);
writewxy(centre(ts,LSC_ToFinish,len),31,1,2,twinp);
savlen = listlen;
savpos = (pno + midlist - 2) % listlen + 1;
do {
inp = upperch(getkey());
switch (inp) {
case RArr :
if ((listwid+listx-1) < 78) {
listwid++;
resizewin(0,0,1,0,fwinp);
for (i=2; i <= (listlen+2); i++)
writewxy(" ",_av,(byte) listwid,(byte )i,fwinp);
}
break;
case LArr :
if (listwid > strlen(LSC_ListMenu)) {
listwid--;
resizewin(0,0,-1,0,fwinp);
}
break;
case DArr :
if ((listlen+listy) < listmax) {
listlen += 2;
resizewin(0,0,0,2,fwinp);
writewxy(strcopy(ts,blnk,0,listwid),_av,1,(byte)(listlen+2),fwinp);
writewxy(strcopy(ts,blnk,0,listwid),_av,1,(byte)(listlen+1),fwinp);
writewxy(strcopy(ts,blnk,0,listwid),_av,1,(byte) listlen,fwinp);
}
break;
case UArr :
if (listlen > 6) {
listlen -=2;
resizewin(0,0,0,-2,fwinp);
}
break;
}
} while ((inp == RArr) || (inp == DArr) || (inp == LArr) || (inp == UArr));
if (savlen != listlen) midlist = (listlen/2) + 1;
refilltab();
savpos = 0;
closewin(&twinp);
wdim.h = (byte)listlen;
wdim.w = (byte)listwid;
wdim.x = (byte)listx;
wdim.y = (byte)listy;
}
break;
case _AltMove :
len = (byte) max(strlen(LSC_UsePr)+5,strlen(LSC_ToFinish));
if (openwin(0,listx+1,listy+1,len,2,31,31,8,"─┐│┘─└│┌",TopCnt,strconcat(ts," ",LSC_Move," ",NULL))) {
twinp = curwin;
twinp->disp = True;
dispwindow(twinp);
writewxy(centre(ts,strconcat(ts,LSC_UsePr," \x1B\x1A\x18\x19",NULL),len),31,1,1,twinp);
writewxy(centre(ts,LSC_ToFinish,len),31,1,2,twinp);
do {
inp = upperch(getkey());
switch (inp) {
case RArr :
if ((listx+listwid) < 80) {
listx++;
scrollwin(3,fwinp);
scrollwin(3,twinp);
}
break;
case LArr :
if (listx > 2) {
listx--;
scrollwin(2,fwinp);
scrollwin(2,twinp);
}
break;
case DArr :
if ((listy+listlen) < (listmax+2)) {
listy++;
scrollwin(1,fwinp);
scrollwin(1,twinp);
}
break;
case UArr :
if (listy > 2) {
listy--;
scrollwin(0,fwinp);
scrollwin(0,twinp);
}
break;
}
} while ((inp == RArr) || (inp == DArr) || (inp == LArr) || (inp == UArr));
closewin(&twinp);
wdim.h = (byte) listlen;
wdim.w = (byte) listwid;
wdim.x = (byte) listx;
wdim.y = (byte) listy;
}
break;
case _AltBrief :
brief = (bool) (!brief);
refilltab(); startpos = 1;
break;
case Enter :
case XeptKey :
fval = labs((*rectab)[((pno+midlist-2)%listlen)+1].ref);
quit_flag = True;
break;
case QitKey :
if (!listing) {
fval = 0;
quit_flag = True;
}
else
audible(Pip);
break;
case UArr :
case DArr :
scroll = 1;
break;
case PgUp :
case PgDn :
scroll = 10;
break;
case RArr :
if ((!brief) && ((startpos+listwid) < 255)) {
startpos++;
redraw = True;
}
else
audible(Warning);
break;
case LArr :
if ((!brief) && (startpos > 1)) {
startpos--;
redraw = True;
}
else
audible(Warning);
break;
case CtrlRArr :
case Tab :
if ((!brief) && ((startpos+listwid) < 255)) {
if ((startpos+listwid) < 245) startpos += 10;
else startpos = (byte) (255 - listwid);
redraw = True;
}
else
audible(Warning);
break;
case CtrlLArr :
case STab :
if ((!brief) && (startpos > 1)) {
if (startpos > 10) startpos -= 10;
else startpos = 1;
redraw = True;
}
else
audible(Warning);
break;
default:
slen = strlen(search);
if (!_xkey) {
if (action != BackSp) {
search[slen] = action;
if ((slen+1) < sizeof(search)) slen++;
}
else if (slen > 0) slen--;
search[slen] = '\0';
if (slen > 0) strcpy(kystr,search); else strcpy(kystr,matchStrFind);
if (_keyexpr != NULL) _keyexpr(kystr,fno,kno,kystr);
searchkey(idx,&recno[fno],kystr);
if (!ok) prevkey(idx,&recno[fno],kystr);
lastdirn = ' '; savpos = 0;
strcopy(matchStrFind,kystr,0,slen);
refilltab();
}
break;
}
}
} while (!quit_flag);
closewin(&fwinp);
}
link = Up_N_Down;
return (fval);
}
/********************** UNIT INITIALIZATION/EXIT CODE *********************/
void db_list_init(void)
{
if (!initialized) {
initialized = True;
db_curs_init();
db_funcs_init();
db_key_init();
db_tree_init();
db_util_init();
db_win_init();
rectab = db_malloc(sizeof(rectabtyp));
_keyexpr = NULL;
_getarec = NULL;
_horizrec = NULL;
lwid = (byte) strlen(LSC_ListMenu);
}
}
/**************************** END OF DB_LIST.C ****************************/